iT邦幫忙

2022 iThome 鐵人賽

0
AI & Data

預測惱人的人事物:跟我一起學習如何用資料分析來避開他們系列 第 35

修復 bug:電池最佳化無法取消 (part 1 of 2)

  • 分享至 

  • xImage
  •  

筆者系列文是以 Samsung 的 Note 10 Lite 進行主要操作。

絕無業配,但歡迎聯繫XD

起因探討

我們在 Day 28 時實作了兩個功能,分別讀取 notifee 抓到的手機系統資訊,以確認系統限制是否會將我們的 app 在背景被 kill 掉,並可以跳轉到對應的開關頁面。

根據 notifee 的文件描述

  1. App 被砍掉的原因有許多種,可以參考 dontkillmyapp.com 這個網站
  2. Android 6.0 以後, notifee 的:
    1. isBatteryOptimizationEnabled 可以用來確認是否最佳化被開啟
    2. openBatteryOptimizationSettings 可以用來跳轉到電池最佳化設定
  3. 有些裝置會有 Power Manager,這也可能會影響:
    1. getPowerManagerInfo 回傳目前的資訊 (activity)
    2. openPowerManagerSettings 可以跳轉到相關設定
    3. google 的手機沒有 activity 的資訊
    4. 三星的叫做 BatteryActivity
  4. 官方針對三星手機有特別的描述區塊:
    1. 三星的 Power Manager 叫做 Device Care
    2. 可以將 app 加入「永不休眠」(Apps that won't be put to sleep) 的清單,來阻止被 kill 掉

筆者想先用透過程式來做個確認~


實作暫時性 component 來確認

以下讓我們在 AnnoyancePrediction/App.js 實作一個元件 Test,用來在頁面上顯示前述提到的系統資訊:

const Test = () => {
  const [data, setData] = useState(null);

  const show = async () => {
    const managerInfo = await notifee.getPowerManagerInfo();

    const optimization = await notifee.isBatteryOptimizationEnabled();

    const result =
      'managerInfo: ' +
      JSON.stringify(managerInfo) +
      '\n\n' +
      'optimization: ' +
      JSON.stringify(optimization);

    setData(result);
  };

  show();

  return (
    // eslint-disable-next-line react-native/no-inline-styles
    <Text h4 style={{backgroundColor: 'white'}}>
      {data}
    </Text>
  );
};

注意需要引入 notifee 以及 React 的 useState

完成以後,讓我們把原來的 title 註解掉,換成 Test

    // 加入新元件
    <Test />

    // 註解原先的 title
    {/* <Text
      h3
      style={[
        {
          marginTop: 20,
          marginLeft: 25,
          marginBottom: 10,
          color: isDarkMode ? lightColors.white : darkColors.white,
        },
      ]}>
      Annoyance Notification
    </Text> */}

虛擬機上畫面看來沒問題,重新 build 之後,讓我們裝到手機看看!


附論:如果沒有 sign upload key 就 build

筆者中間有在不同的筆電操作,因為沒加入 upload key,在 build 時遇到以下錯誤:

Task 'installRelease' not found in project ':app'. Some candidates are: 'uninstallRelease'.

這時只要完成進行我們 Day 30 提到 release 的步驟即可~


在實體機上確認

打開來看到我們的 Activity 如同描述,是 BatteryActivity。此時的 Optimization是 true:
https://ithelp.ithome.com.tw/upload/images/20221020/20141357bhZm0Rzppw.jpg

讓我們 app 長按,進到資訊頁,選擇電池,讓我們調成不受限制(最佳化關閉):
https://ithelp.ithome.com.tw/upload/images/20221020/20141357eG94NeyNKq.jpg

最佳化關閉後,重新打開 app,我們看到 Activity 不變,但 Optimization 變成 false:
https://ithelp.ithome.com.tw/upload/images/20221020/20141357EXq3AoHO9z.jpg

然而讓我們再將最佳化開啟、點擊對話框中的 open settings,會被帶到系統的電池頁,裡面我們進入「背景用量上限」:
https://ithelp.ithome.com.tw/upload/images/20221020/20141357fOB3dz179f.jpg

我們讓 app 進入永不休眠的名單:
https://ithelp.ithome.com.tw/upload/images/20221020/20141357vSvWFWTOpW.jpg

重新打開 app,Optimization 會回到 true,等同於一開始沒有設定的情形
https://ithelp.ithome.com.tw/upload/images/20221020/20141357ReqH16sR9d.jpg

然而我們若再次將最佳化關閉,Optimization 又會被變成 false:
https://ithelp.ithome.com.tw/upload/images/20221020/20141357wBePD5tiYP.jpg


推測 & 實驗

似乎起作用的只有最佳化設定這一段,手機上的 Activity 是 BatteryActivity 沒有變化。

筆者決定先把 Power Manager 的檢測拿掉,並關閉最佳化後,實際使用看看。

讓我們註解 AnnoyancePrediction/src/checkAndroidBackgroundRestrictions.js 以下段落:

  // 以下需要註解或刪掉
  // 1. get info on the device and the Power Manager settings
  const powerManagerInfo = await notifee.getPowerManagerInfo();
  if (powerManagerInfo.activity) {
    // 2. ask your users to adjust their settings
    Alert.alert(
      'Restrictions Detected',
      'To ensure notifications are delivered, please adjust your settings to prevent the app from being killed',
      [
        // 3. launch intent to navigate the user to the appropriate screen
        {
          text: 'OK, open settings',
          onPress: async () => await notifee.openPowerManagerSettings(),
        },
        {
          text: 'Cancel',
          onPress: () => console.log('Cancel Pressed'),
          style: 'cancel',
        },
      ],
      {cancelable: false},
    );
  }

並將文章前半部暫時加入的 Test 元件刪除,改回原先的 title,重新 build 裝到手機上實測吧。

今天收工!

參考資料

changelog

  • 20221021: 刪除部分贅字 & 優化排版

上一篇
記錄 bug:重複通知 & 電池最佳化無法取消
下一篇
修復 bug:重複通知 & 附帶處理 Notifee 原生的循環通知
系列文
預測惱人的人事物:跟我一起學習如何用資料分析來避開他們38
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言